import Web3 from 'web3';
import { promises as fs } from 'fs';
import BN  from 'bn.js'; // 导入 BN 库

/***
 * 调用L2->shard1上的合约存储1币
 */

// 读取 AdventureLayerSepoliaTransfer 合约的 ABI


const jsonData = await fs.readFile('./build/contracts/AdventureLayerSepoliaTransfer.json', 'utf-8');
const bridgeJson = JSON.parse(jsonData);
const bridgeAbi = bridgeJson.abi;
console.log(bridgeAbi);

// 配置参数
const USER_ADDRESS = '0xba44663eB184De58C3A15f588C0e88Bf6148Fd19'; // 你的钱包地址 Account8
const PRIVATE_KEY = '0x5d64c0c661bbec1c6b2a999fa2b506f11fde4c47a88f7cf207905fe318ed4cb0'; // 你的钱包私钥
const RPC_URL = 'https://rpc-devnet.adventurelayer.xyz'; // 你的以太坊节点RPC URL
const BRIDGE_CONTRACT_ADDRESS = '0x43f0ffca27b26dcfa02fce8ca5d97f2f85cbf3fa'; // AdventureLayerSepoliaTransfer 合约地址


// Web3 设置
const web3 = new Web3(RPC_URL);

// 后续的 Web3 合约和交易操作
console.log('Web3 已成功连接:');


async function main() {

    // 查询 USER_ADDRESS 这个账户的余额
    const balance = await web3.eth.getBalance(USER_ADDRESS);
    console.log(`账户 ${USER_ADDRESS} 的余额为: ${web3.utils.fromWei(balance, 'ether')} ETH`);

    const amount = '3.2'
    // 设置存款金额（例如 10 个代币）
    const depositAmount = web3.utils.toWei(amount, 'ether'); // 存入 1.2 TOKEN

    // 创建 L1Bridge 合约实例
    const bridgeContract = new web3.eth.Contract(bridgeAbi, BRIDGE_CONTRACT_ADDRESS);


    // current block
    const block = await web3.eth.getBlock('latest');
    const baseFeePerGas = new BN(block.baseFeePerGas); // 将 baseFeePerGas 转换为 BN 对象
    // 设置费用参数
    const maxPriorityFeePerGas = new BN(web3.utils.toWei('1', 'gwei')); // 优先费用
    // 计算最大费用：最大费用 = 基础费用 * 2 + 优先费用
    const maxFeePerGas = baseFeePerGas.mul(new BN(1.1)).add(maxPriorityFeePerGas);

    const nonce = await web3.eth.getTransactionCount(USER_ADDRESS, 'latest');


    // 创建交易对象
    const tx = {
        from: USER_ADDRESS,
        to: BRIDGE_CONTRACT_ADDRESS,
        value: depositAmount,
        data: bridgeContract.methods.deposit().encodeABI(),
        gas: 2000000,
        maxFeePerGas: maxFeePerGas.toString(),
        maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),
        nonce: nonce  // 使用最新的 nonce
    };

    // 使用账户私钥签署交易
    const signedTx = await web3.eth.accounts.signTransaction(tx, PRIVATE_KEY);

    // 调用 deposit 函数
    console.log(`正在存入 ${amount} Tokens 到桥合约...`);
    // 发送已签署的交易
    const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction);



    console.log("存款已完成。交易哈希:", receipt.transactionHash);

    // 监听 Deposit 事件
    bridgeContract.events.Deposit({
        filter: { user: USER_ADDRESS },
        fromBlock: 'latest'
    })
    .on('data', (event) => {
        console.log("检测到存款事件:");
        console.log(`用户地址: ${event.returnValues.sender}`);
        console.log(`存款金额: ${event.returnValues.amount} Wei`);
        console.log(`时间戳: ${new Date(Number(event.returnValues.timestamp) * 1000).toLocaleString()}`);
        console.log(`交易哈希: ${event.transactionHash}`);
        console.log(`日志索引: ${event.logIndex}`);
        console.log('-----------------------------');
    });
    //.on('error', console.error);

    console.log("监听 Deposit 事件中...");
}

main().catch(error => {
    console.error("发生错误:", error);
    process.exit(1);
});
